

#include "head.h"
#include "sem.h"
int semid;
void sighandler(int sig)
{
    semctl(semid, 0, IPC_RMID);
}
int main(int argc, char const *argv[])
{
    signal(SIGINT, sighandler);
    // 1， 创建共享内存、信号量IPC对象
    key_t key1 = ftok(PROJPATH, PROJSHM);   
    int shmid = shmget(key1, 128, IPC_CREAT|0666);

    key_t key2 = ftok(PROJPATH, PROJSEM);   
    semid = semget(key2, 2, IPC_CREAT|IPC_EXCL|0666);
    if(semid != -1)
    {
        // 当前进程创建了该SEM，于是对其进行初始化
        sem_set(semid, DATA, 0);
        sem_set(semid, MEM , 1);
    }
    else if(semid == -1 && errno ==EEXIST)
    {
        semid = semget(key2, 2, IPC_CREAT|0666);
    }
    else
    {
        perror("semget() failed");
        exit(0);
    }

    // 2，将SHM映射到本进程的内存空间
    //    NULL: 让Linux自动为本SHM分配虚拟地址入口
    //    0   : 以读写方式映射
    char *p = shmat(shmid, NULL, 0);
    if(p == (void*)-1)
    {
        perror("shmat失败");
        exit(0);
    }

    // 3，从SHM读出数据
    while(1)
    {
        if(!sem_p(semid, DATA))
        {
            break;
        }
        printf("%s", p);
        sem_v(semid, MEM);
    }

    return 0;
}
